package com.appcaja.server.service;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.appcaja.server.dao.IOrdenDAO;
import com.appcaja.server.model.Orden;

/**
 * Capa de servicio para ordenes
 *
 * @author Jere
 */
@Service
public class OrdenService {

	@Autowired
	IOrdenDAO ordenDAO;
	
	/**
	 * Obtiene la lista de ordenes.
	 *
	 * @return La lista de ordenes.
	 */
	public List<Orden> obtenerOrdenes() {
		return ordenDAO.obtenerOrdenes();
	}

	/**
	 * Obtiene una orden determinada segun su CGI.
	 *
	 * @param cgi Numero identificador CGI
	 * @return La orden correspondiente. 
	 */
	public Orden obtenerOrden(long cgi) {
		return ordenDAO.obtenerOrdenPorCGI(cgi);
	}
	
	/**
	 * Filtra ordenes
	 *
	 * @param expediente
	 * @param causanteBeneficiario
	 * @param estadoVerif
	 * @return
	 */
	public List<Orden> buscarOrdenes(String expediente,
			String causanteBeneficiario,
			String estadoVerif,
			String cgi,
			String fechaDesde,
			String fechaHasta) {
		Map<String, List<String>> filtros = this.parsearFiltros(expediente,
				causanteBeneficiario,
				estadoVerif,
				cgi,
				fechaDesde,
				fechaHasta);
		return ordenDAO.filtrarOrdenes(filtros);
	}
	
	/**
	 * Metodo para parsear los filtros que el usuario selecciono y convertirlos en un mapa.
	 * @param expediente
	 * @param causanteBeneficiario
	 * @param estadoVerif
	 * @return Un mapa con los filtros parseados.
	 */
	private Map<String, List<String>> parsearFiltros(String expediente,
			String causanteBeneficiario,
			String estadoVerif,
			String cgi,
			String fechaDesde,
			String fechaHasta) {
		Map<String, List<String>> filtros = new HashMap<String, List<String>>(); 
		if (expediente != null && !expediente.isEmpty()) {
			filtros.put("Expediente", Arrays.asList(expediente.split(",")));
		}
		if (causanteBeneficiario != null && !causanteBeneficiario.isEmpty()) {
			String[] causantesBeneficiarios = causanteBeneficiario.split(",");
			for (int i = 0; i < causantesBeneficiarios.length; i++) {
				causantesBeneficiarios[i] = "%" + causantesBeneficiarios[i] + "%";
			}
			filtros.put("CausanteBeneficiario", Arrays.asList(causantesBeneficiarios));
		}
		if (estadoVerif != null && !estadoVerif.isEmpty()) {
			filtros.put("estadoVerif", Arrays.asList(estadoVerif.split(",")));
		}
		if (cgi != null && !cgi.isEmpty()) {
			filtros.put("cgi", Arrays.asList(cgi.split(",")));
		}
		if (fechaDesde != null && !fechaDesde.isEmpty()) {
			Calendar c = Calendar.getInstance();
			c.setTimeInMillis(Long.parseLong(fechaDesde));
			SimpleDateFormat sdf = new SimpleDateFormat("YYYY/MM/dd");
			fechaDesde = sdf.format(c.getTime());
			filtros.put("fechaDesde", Arrays.asList(fechaDesde.split(",")));
		}
		if (fechaHasta != null && !fechaHasta.isEmpty()) {
			Calendar c = Calendar.getInstance();
			c.setTimeInMillis(Long.parseLong(fechaHasta));
			SimpleDateFormat sdf = new SimpleDateFormat("YYYY/MM/dd");
			fechaHasta = sdf.format(c.getTime());
			filtros.put("fechaHasta", Arrays.asList(fechaHasta.split(",")));
		}
		return filtros;
	}
}
